{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import datetime as dt\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.tree import DecisionTreeRegressor\n",
    "from sklearn.linear_model import Ridge, Lasso\n",
    "from sklearn.model_selection import KFold\n",
    "from sklearn.neighbors import KNeighborsRegressor\n",
    "\n",
    "import warnings \n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "df=pd.read_csv(\"nyc_taxi_trip_duration.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id</th>\n",
       "      <th>vendor_id</th>\n",
       "      <th>pickup_datetime</th>\n",
       "      <th>dropoff_datetime</th>\n",
       "      <th>passenger_count</th>\n",
       "      <th>pickup_longitude</th>\n",
       "      <th>pickup_latitude</th>\n",
       "      <th>dropoff_longitude</th>\n",
       "      <th>dropoff_latitude</th>\n",
       "      <th>store_and_fwd_flag</th>\n",
       "      <th>trip_duration</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>id1080784</td>\n",
       "      <td>2</td>\n",
       "      <td>2016-02-29 16:40:21</td>\n",
       "      <td>2016-02-29 16:47:01</td>\n",
       "      <td>1</td>\n",
       "      <td>-73.953918</td>\n",
       "      <td>40.778873</td>\n",
       "      <td>-73.963875</td>\n",
       "      <td>40.771164</td>\n",
       "      <td>N</td>\n",
       "      <td>400</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>id0889885</td>\n",
       "      <td>1</td>\n",
       "      <td>2016-03-11 23:35:37</td>\n",
       "      <td>2016-03-11 23:53:57</td>\n",
       "      <td>2</td>\n",
       "      <td>-73.988312</td>\n",
       "      <td>40.731743</td>\n",
       "      <td>-73.994751</td>\n",
       "      <td>40.694931</td>\n",
       "      <td>N</td>\n",
       "      <td>1100</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>id0857912</td>\n",
       "      <td>2</td>\n",
       "      <td>2016-02-21 17:59:33</td>\n",
       "      <td>2016-02-21 18:26:48</td>\n",
       "      <td>2</td>\n",
       "      <td>-73.997314</td>\n",
       "      <td>40.721458</td>\n",
       "      <td>-73.948029</td>\n",
       "      <td>40.774918</td>\n",
       "      <td>N</td>\n",
       "      <td>1635</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>id3744273</td>\n",
       "      <td>2</td>\n",
       "      <td>2016-01-05 09:44:31</td>\n",
       "      <td>2016-01-05 10:03:32</td>\n",
       "      <td>6</td>\n",
       "      <td>-73.961670</td>\n",
       "      <td>40.759720</td>\n",
       "      <td>-73.956779</td>\n",
       "      <td>40.780628</td>\n",
       "      <td>N</td>\n",
       "      <td>1141</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>id0232939</td>\n",
       "      <td>1</td>\n",
       "      <td>2016-02-17 06:42:23</td>\n",
       "      <td>2016-02-17 06:56:31</td>\n",
       "      <td>1</td>\n",
       "      <td>-74.017120</td>\n",
       "      <td>40.708469</td>\n",
       "      <td>-73.988182</td>\n",
       "      <td>40.740631</td>\n",
       "      <td>N</td>\n",
       "      <td>848</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          id  vendor_id      pickup_datetime     dropoff_datetime  \\\n",
       "0  id1080784          2  2016-02-29 16:40:21  2016-02-29 16:47:01   \n",
       "1  id0889885          1  2016-03-11 23:35:37  2016-03-11 23:53:57   \n",
       "2  id0857912          2  2016-02-21 17:59:33  2016-02-21 18:26:48   \n",
       "3  id3744273          2  2016-01-05 09:44:31  2016-01-05 10:03:32   \n",
       "4  id0232939          1  2016-02-17 06:42:23  2016-02-17 06:56:31   \n",
       "\n",
       "   passenger_count  pickup_longitude  pickup_latitude  dropoff_longitude  \\\n",
       "0                1        -73.953918        40.778873         -73.963875   \n",
       "1                2        -73.988312        40.731743         -73.994751   \n",
       "2                2        -73.997314        40.721458         -73.948029   \n",
       "3                6        -73.961670        40.759720         -73.956779   \n",
       "4                1        -74.017120        40.708469         -73.988182   \n",
       "\n",
       "   dropoff_latitude store_and_fwd_flag  trip_duration  \n",
       "0         40.771164                  N            400  \n",
       "1         40.694931                  N           1100  \n",
       "2         40.774918                  N           1635  \n",
       "3         40.780628                  N           1141  \n",
       "4         40.740631                  N            848  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['pickup_datetime'] = pd.to_datetime(df['pickup_datetime'])\n",
    "df['dropoff_datetime'] = pd.to_datetime(df['dropoff_datetime'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['pickup_hour'] = df['pickup_datetime'].dt.hour\n",
    "df['pickup_day'] = df['pickup_datetime'].dt.dayofweek\n",
    "df['dropoff_hour'] = df['dropoff_datetime'].dt.hour\n",
    "df['dropoff_day'] = df['dropoff_datetime'].dt.dayofweek\n",
    "df['pickup_month']=df['pickup_datetime'].dt.month\n",
    "df['dropoff_month']=df['dropoff_datetime'].dt.month\n",
    "df['pickup_location'] = df[['pickup_latitude', 'pickup_longitude']].apply(tuple, axis=1)\n",
    "df['dropoff_location'] = df[['dropoff_latitude', 'dropoff_longitude']].apply(tuple, axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_y=np.log1p(df['trip_duration'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['store_and_fwd_flag']=df['store_and_fwd_flag'].apply(lambda store_and_fwd_flag:1 if store_and_fwd_flag=='Y' else 0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "from haversine import haversine"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['distance_km'] = df.apply(lambda df: haversine(df['pickup_location'], df['dropoff_location']), axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "df['vendor_id']=df['vendor_id']-1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "id                            object\n",
       "vendor_id                      int64\n",
       "pickup_datetime       datetime64[ns]\n",
       "dropoff_datetime      datetime64[ns]\n",
       "passenger_count                int64\n",
       "pickup_longitude             float64\n",
       "pickup_latitude              float64\n",
       "dropoff_longitude            float64\n",
       "dropoff_latitude             float64\n",
       "store_and_fwd_flag             int64\n",
       "trip_duration                  int64\n",
       "pickup_hour                    int64\n",
       "pickup_day                     int64\n",
       "dropoff_hour                   int64\n",
       "dropoff_day                    int64\n",
       "pickup_month                   int64\n",
       "dropoff_month                  int64\n",
       "pickup_location               object\n",
       "dropoff_location              object\n",
       "distance_km                  float64\n",
       "dtype: object"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.dtypes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = df.drop(['id','pickup_datetime','dropoff_datetime','store_and_fwd_flag','trip_duration','pickup_location','dropoff_location'], axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "from math import sqrt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import mean_squared_error"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "def cv_score(ml_model,rstate=12,cols=df.columns):\n",
    "    i=1\n",
    "    cv_scores=[]\n",
    "    df1=df.copy()\n",
    "    df1=df[cols]\n",
    "    \n",
    "    kf=KFold(n_splits=5,random_state=rstate,shuffle=True)\n",
    "    for train_index,test_index in kf.split(df1,df_y):\n",
    "        print('\\n{} of kfold {}'.format(i,kf.n_splits))\n",
    "        xtr,xvl = df1.loc[train_index].values,df1.loc[test_index].values\n",
    "        ytr,yvl = df_y[train_index].values,df_y[test_index].values\n",
    "        \n",
    "        model=ml_model\n",
    "        model.fit(xtr,ytr)\n",
    "        train_val = model.predict(xtr)\n",
    "        pred_val = model.predict(xvl)\n",
    "        rmse_score_train = sqrt(mean_squared_error(ytr,train_val))\n",
    "        rmse_score = sqrt(mean_squared_error(yvl,pred_val))\n",
    "        suffix = \"\"\n",
    "        msg = \"\"\n",
    "        msg += \"Train RMSE: {:.5f}\".format(rmse_score_train)\n",
    "        msg += \"Valid RMSE: {:.5f}\".format(rmse_score)\n",
    "        print(\"{}\".format(msg))\n",
    "        \n",
    "        cv_scores.append(rmse_score)\n",
    "        i+=1\n",
    "    return cv_scores    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.ensemble import RandomForestRegressor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "1 of kfold 5\n",
      "Train RMSE: 0.41956Valid RMSE: 0.42859\n",
      "\n",
      "2 of kfold 5\n",
      "Train RMSE: 0.41844Valid RMSE: 0.43250\n",
      "\n",
      "3 of kfold 5\n",
      "Train RMSE: 0.41774Valid RMSE: 0.43665\n",
      "\n",
      "4 of kfold 5\n",
      "Train RMSE: 0.41894Valid RMSE: 0.43122\n",
      "\n",
      "5 of kfold 5\n",
      "Train RMSE: 0.41891Valid RMSE: 0.43199\n"
     ]
    }
   ],
   "source": [
    "rf_params = {'random_state':0, 'n_estimators':20, 'max_depth':11,'n_jobs':-1, 'min_samples_split':43}\n",
    "rf_scores = cv_score(RandomForestRegressor(**rf_params))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "import xgboost as xgb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "xtrain, xtest, ytrain, ytest = train_test_split(df,df_y,test_size=1/3,random_state=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "dtrain = xgb.DMatrix(xtrain, label=ytrain)\n",
    "dvalid = xgb.DMatrix(xtest, label=ytest)\n",
    "\n",
    "watchlist = [(dtrain,'train'),(dvalid,'valid')]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0]\ttrain-rmse:5.72448\tvalid-rmse:5.72162\n",
      "Multiple eval metrics have been passed: 'valid-rmse' will be used for early stopping.\n",
      "\n",
      "Will train until valid-rmse hasn't improved in 50 rounds.\n",
      "[20]\ttrain-rmse:2.10261\tvalid-rmse:2.10134\n",
      "[40]\ttrain-rmse:0.86874\tvalid-rmse:0.86948\n",
      "[60]\ttrain-rmse:0.520427\tvalid-rmse:0.523417\n",
      "[80]\ttrain-rmse:0.447218\tvalid-rmse:0.451352\n",
      "[100]\ttrain-rmse:0.428905\tvalid-rmse:0.433545\n",
      "[120]\ttrain-rmse:0.421354\tvalid-rmse:0.426417\n",
      "[140]\ttrain-rmse:0.415947\tvalid-rmse:0.421266\n",
      "[160]\ttrain-rmse:0.411785\tvalid-rmse:0.417518\n",
      "[180]\ttrain-rmse:0.4085\tvalid-rmse:0.41469\n",
      "[200]\ttrain-rmse:0.404198\tvalid-rmse:0.410653\n",
      "[220]\ttrain-rmse:0.402036\tvalid-rmse:0.408748\n",
      "[240]\ttrain-rmse:0.398699\tvalid-rmse:0.405708\n",
      "[260]\ttrain-rmse:0.396796\tvalid-rmse:0.404159\n",
      "[280]\ttrain-rmse:0.394708\tvalid-rmse:0.402237\n",
      "[300]\ttrain-rmse:0.392547\tvalid-rmse:0.400399\n",
      "[320]\ttrain-rmse:0.390423\tvalid-rmse:0.398468\n",
      "[340]\ttrain-rmse:0.389343\tvalid-rmse:0.39768\n",
      "[360]\ttrain-rmse:0.387652\tvalid-rmse:0.396311\n",
      "[380]\ttrain-rmse:0.386452\tvalid-rmse:0.39525\n",
      "[400]\ttrain-rmse:0.385349\tvalid-rmse:0.394317\n",
      "[420]\ttrain-rmse:0.383904\tvalid-rmse:0.393128\n",
      "[440]\ttrain-rmse:0.382653\tvalid-rmse:0.392045\n",
      "[460]\ttrain-rmse:0.381674\tvalid-rmse:0.39136\n",
      "[480]\ttrain-rmse:0.380837\tvalid-rmse:0.390883\n",
      "[500]\ttrain-rmse:0.379787\tvalid-rmse:0.390171\n",
      "[520]\ttrain-rmse:0.378933\tvalid-rmse:0.389473\n",
      "[540]\ttrain-rmse:0.377603\tvalid-rmse:0.388421\n",
      "[560]\ttrain-rmse:0.376325\tvalid-rmse:0.387156\n",
      "[580]\ttrain-rmse:0.37552\tvalid-rmse:0.386609\n",
      "[600]\ttrain-rmse:0.374376\tvalid-rmse:0.385728\n",
      "[620]\ttrain-rmse:0.373301\tvalid-rmse:0.38484\n",
      "[640]\ttrain-rmse:0.371996\tvalid-rmse:0.38362\n",
      "[660]\ttrain-rmse:0.371247\tvalid-rmse:0.383018\n",
      "[680]\ttrain-rmse:0.370546\tvalid-rmse:0.382559\n",
      "[700]\ttrain-rmse:0.369586\tvalid-rmse:0.381828\n",
      "[720]\ttrain-rmse:0.369006\tvalid-rmse:0.381426\n",
      "[740]\ttrain-rmse:0.368349\tvalid-rmse:0.381091\n",
      "[760]\ttrain-rmse:0.367122\tvalid-rmse:0.380138\n",
      "[780]\ttrain-rmse:0.366581\tvalid-rmse:0.379808\n",
      "[800]\ttrain-rmse:0.36583\tvalid-rmse:0.379302\n",
      "[820]\ttrain-rmse:0.365229\tvalid-rmse:0.378988\n",
      "[840]\ttrain-rmse:0.364604\tvalid-rmse:0.378507\n",
      "[860]\ttrain-rmse:0.363838\tvalid-rmse:0.377947\n",
      "[880]\ttrain-rmse:0.363\tvalid-rmse:0.377352\n",
      "[900]\ttrain-rmse:0.362336\tvalid-rmse:0.376911\n",
      "[920]\ttrain-rmse:0.361683\tvalid-rmse:0.376498\n",
      "[940]\ttrain-rmse:0.36091\tvalid-rmse:0.375969\n",
      "[960]\ttrain-rmse:0.360192\tvalid-rmse:0.375489\n",
      "[980]\ttrain-rmse:0.359768\tvalid-rmse:0.375365\n",
      "[1000]\ttrain-rmse:0.359344\tvalid-rmse:0.375135\n",
      "[1020]\ttrain-rmse:0.358912\tvalid-rmse:0.374867\n",
      "[1040]\ttrain-rmse:0.358418\tvalid-rmse:0.374567\n",
      "[1060]\ttrain-rmse:0.35797\tvalid-rmse:0.374486\n",
      "[1080]\ttrain-rmse:0.357389\tvalid-rmse:0.374078\n",
      "[1100]\ttrain-rmse:0.357014\tvalid-rmse:0.37401\n",
      "[1120]\ttrain-rmse:0.356509\tvalid-rmse:0.37374\n",
      "[1140]\ttrain-rmse:0.356057\tvalid-rmse:0.373484\n",
      "[1160]\ttrain-rmse:0.355332\tvalid-rmse:0.372956\n",
      "[1180]\ttrain-rmse:0.354886\tvalid-rmse:0.372771\n",
      "[1200]\ttrain-rmse:0.354431\tvalid-rmse:0.372487\n",
      "[1220]\ttrain-rmse:0.35395\tvalid-rmse:0.372269\n",
      "[1240]\ttrain-rmse:0.353538\tvalid-rmse:0.372103\n",
      "[1260]\ttrain-rmse:0.353141\tvalid-rmse:0.371921\n",
      "[1280]\ttrain-rmse:0.352675\tvalid-rmse:0.371769\n",
      "[1300]\ttrain-rmse:0.352353\tvalid-rmse:0.371732\n",
      "[1320]\ttrain-rmse:0.351939\tvalid-rmse:0.371472\n",
      "[1340]\ttrain-rmse:0.35137\tvalid-rmse:0.371076\n",
      "[1360]\ttrain-rmse:0.351059\tvalid-rmse:0.371008\n",
      "[1380]\ttrain-rmse:0.350455\tvalid-rmse:0.370552\n",
      "[1400]\ttrain-rmse:0.35001\tvalid-rmse:0.370246\n",
      "[1420]\ttrain-rmse:0.349762\tvalid-rmse:0.370135\n",
      "[1440]\ttrain-rmse:0.349326\tvalid-rmse:0.369943\n",
      "[1460]\ttrain-rmse:0.348689\tvalid-rmse:0.369488\n",
      "[1480]\ttrain-rmse:0.348369\tvalid-rmse:0.36942\n",
      "[1500]\ttrain-rmse:0.348145\tvalid-rmse:0.369357\n",
      "[1520]\ttrain-rmse:0.347806\tvalid-rmse:0.36922\n",
      "[1540]\ttrain-rmse:0.347392\tvalid-rmse:0.368979\n",
      "[1560]\ttrain-rmse:0.347145\tvalid-rmse:0.36894\n",
      "[1580]\ttrain-rmse:0.346923\tvalid-rmse:0.368906\n",
      "[1600]\ttrain-rmse:0.346696\tvalid-rmse:0.368833\n",
      "[1620]\ttrain-rmse:0.346028\tvalid-rmse:0.368381\n",
      "[1640]\ttrain-rmse:0.345749\tvalid-rmse:0.368327\n",
      "[1660]\ttrain-rmse:0.345467\tvalid-rmse:0.368226\n",
      "[1680]\ttrain-rmse:0.34498\tvalid-rmse:0.367956\n",
      "[1700]\ttrain-rmse:0.344649\tvalid-rmse:0.367867\n",
      "[1720]\ttrain-rmse:0.344256\tvalid-rmse:0.367632\n",
      "[1740]\ttrain-rmse:0.343978\tvalid-rmse:0.367544\n",
      "[1760]\ttrain-rmse:0.343615\tvalid-rmse:0.367359\n",
      "[1780]\ttrain-rmse:0.343412\tvalid-rmse:0.367268\n",
      "[1800]\ttrain-rmse:0.342973\tvalid-rmse:0.366996\n",
      "[1820]\ttrain-rmse:0.342697\tvalid-rmse:0.366842\n",
      "[1840]\ttrain-rmse:0.342399\tvalid-rmse:0.366666\n",
      "[1860]\ttrain-rmse:0.342137\tvalid-rmse:0.36658\n",
      "[1880]\ttrain-rmse:0.341889\tvalid-rmse:0.366492\n",
      "[1900]\ttrain-rmse:0.34151\tvalid-rmse:0.366237\n",
      "[1920]\ttrain-rmse:0.341067\tvalid-rmse:0.366005\n",
      "[1940]\ttrain-rmse:0.340821\tvalid-rmse:0.365942\n",
      "[1960]\ttrain-rmse:0.340522\tvalid-rmse:0.365879\n",
      "[1980]\ttrain-rmse:0.340223\tvalid-rmse:0.36577\n",
      "[2000]\ttrain-rmse:0.339958\tvalid-rmse:0.365702\n",
      "[2020]\ttrain-rmse:0.339795\tvalid-rmse:0.365664\n",
      "[2040]\ttrain-rmse:0.339488\tvalid-rmse:0.365517\n",
      "[2060]\ttrain-rmse:0.339231\tvalid-rmse:0.365402\n",
      "[2080]\ttrain-rmse:0.338952\tvalid-rmse:0.365278\n",
      "[2100]\ttrain-rmse:0.338613\tvalid-rmse:0.365093\n",
      "[2120]\ttrain-rmse:0.338335\tvalid-rmse:0.364968\n",
      "[2140]\ttrain-rmse:0.33805\tvalid-rmse:0.364837\n",
      "[2160]\ttrain-rmse:0.337737\tvalid-rmse:0.364643\n",
      "[2180]\ttrain-rmse:0.337491\tvalid-rmse:0.364578\n",
      "[2200]\ttrain-rmse:0.337262\tvalid-rmse:0.364539\n",
      "[2220]\ttrain-rmse:0.337023\tvalid-rmse:0.36448\n",
      "[2240]\ttrain-rmse:0.336777\tvalid-rmse:0.36439\n",
      "[2260]\ttrain-rmse:0.336508\tvalid-rmse:0.364288\n",
      "[2280]\ttrain-rmse:0.336179\tvalid-rmse:0.36412\n",
      "[2300]\ttrain-rmse:0.335953\tvalid-rmse:0.364059\n",
      "[2320]\ttrain-rmse:0.335711\tvalid-rmse:0.363939\n",
      "[2340]\ttrain-rmse:0.335483\tvalid-rmse:0.363867\n",
      "[2360]\ttrain-rmse:0.335259\tvalid-rmse:0.36377\n",
      "[2380]\ttrain-rmse:0.335083\tvalid-rmse:0.363743\n",
      "[2400]\ttrain-rmse:0.334804\tvalid-rmse:0.363646\n",
      "[2420]\ttrain-rmse:0.33462\tvalid-rmse:0.363635\n",
      "[2440]\ttrain-rmse:0.334388\tvalid-rmse:0.363553\n",
      "[2460]\ttrain-rmse:0.334153\tvalid-rmse:0.363492\n",
      "[2480]\ttrain-rmse:0.333903\tvalid-rmse:0.363387\n",
      "[2500]\ttrain-rmse:0.333737\tvalid-rmse:0.363317\n",
      "[2520]\ttrain-rmse:0.333504\tvalid-rmse:0.363221\n",
      "[2540]\ttrain-rmse:0.333296\tvalid-rmse:0.363178\n",
      "[2560]\ttrain-rmse:0.333097\tvalid-rmse:0.363162\n",
      "[2580]\ttrain-rmse:0.332887\tvalid-rmse:0.363098\n",
      "[2600]\ttrain-rmse:0.332721\tvalid-rmse:0.363038\n",
      "[2620]\ttrain-rmse:0.332531\tvalid-rmse:0.363008\n",
      "[2640]\ttrain-rmse:0.332252\tvalid-rmse:0.362878\n",
      "[2660]\ttrain-rmse:0.331955\tvalid-rmse:0.362733\n",
      "[2680]\ttrain-rmse:0.331659\tvalid-rmse:0.362545\n",
      "[2700]\ttrain-rmse:0.331434\tvalid-rmse:0.362441\n",
      "[2720]\ttrain-rmse:0.331232\tvalid-rmse:0.36235\n",
      "[2740]\ttrain-rmse:0.330934\tvalid-rmse:0.362201\n",
      "[2760]\ttrain-rmse:0.330765\tvalid-rmse:0.362151\n",
      "[2780]\ttrain-rmse:0.330609\tvalid-rmse:0.362111\n",
      "[2800]\ttrain-rmse:0.330267\tvalid-rmse:0.361963\n",
      "[2820]\ttrain-rmse:0.330104\tvalid-rmse:0.361941\n",
      "[2840]\ttrain-rmse:0.329889\tvalid-rmse:0.361897\n",
      "[2860]\ttrain-rmse:0.329701\tvalid-rmse:0.361842\n",
      "[2880]\ttrain-rmse:0.329512\tvalid-rmse:0.361777\n",
      "[2900]\ttrain-rmse:0.329311\tvalid-rmse:0.361689\n",
      "[2920]\ttrain-rmse:0.329043\tvalid-rmse:0.36153\n",
      "[2940]\ttrain-rmse:0.328894\tvalid-rmse:0.361514\n",
      "[2960]\ttrain-rmse:0.328713\tvalid-rmse:0.361523\n",
      "[2980]\ttrain-rmse:0.328548\tvalid-rmse:0.361509\n",
      "[3000]\ttrain-rmse:0.328337\tvalid-rmse:0.361415\n",
      "[3020]\ttrain-rmse:0.328194\tvalid-rmse:0.361404\n",
      "[3040]\ttrain-rmse:0.327976\tvalid-rmse:0.36131\n",
      "[3060]\ttrain-rmse:0.327779\tvalid-rmse:0.361275\n",
      "[3080]\ttrain-rmse:0.327606\tvalid-rmse:0.361235\n",
      "[3100]\ttrain-rmse:0.327376\tvalid-rmse:0.36111\n",
      "[3120]\ttrain-rmse:0.32722\tvalid-rmse:0.361091\n",
      "[3140]\ttrain-rmse:0.327063\tvalid-rmse:0.361046\n",
      "[3160]\ttrain-rmse:0.326838\tvalid-rmse:0.360964\n",
      "[3180]\ttrain-rmse:0.326678\tvalid-rmse:0.360944\n",
      "[3200]\ttrain-rmse:0.326502\tvalid-rmse:0.36091\n",
      "[3220]\ttrain-rmse:0.326194\tvalid-rmse:0.360685\n",
      "[3240]\ttrain-rmse:0.326033\tvalid-rmse:0.360656\n",
      "[3260]\ttrain-rmse:0.325882\tvalid-rmse:0.360639\n",
      "[3280]\ttrain-rmse:0.325712\tvalid-rmse:0.360603\n",
      "[3300]\ttrain-rmse:0.325565\tvalid-rmse:0.36058\n",
      "[3320]\ttrain-rmse:0.325382\tvalid-rmse:0.360579\n",
      "[3340]\ttrain-rmse:0.325225\tvalid-rmse:0.360545\n",
      "[3360]\ttrain-rmse:0.325086\tvalid-rmse:0.360503\n",
      "[3380]\ttrain-rmse:0.324918\tvalid-rmse:0.360463\n",
      "[3400]\ttrain-rmse:0.324714\tvalid-rmse:0.360383\n",
      "[3420]\ttrain-rmse:0.32456\tvalid-rmse:0.360355\n",
      "[3440]\ttrain-rmse:0.324385\tvalid-rmse:0.360324\n",
      "[3460]\ttrain-rmse:0.324229\tvalid-rmse:0.360276\n",
      "[3480]\ttrain-rmse:0.324047\tvalid-rmse:0.360225\n",
      "[3500]\ttrain-rmse:0.32392\tvalid-rmse:0.360201\n",
      "[3520]\ttrain-rmse:0.323788\tvalid-rmse:0.360185\n",
      "[3540]\ttrain-rmse:0.323635\tvalid-rmse:0.360165\n",
      "[3560]\ttrain-rmse:0.323484\tvalid-rmse:0.360154\n",
      "[3580]\ttrain-rmse:0.323341\tvalid-rmse:0.360136\n",
      "[3600]\ttrain-rmse:0.323175\tvalid-rmse:0.360125\n",
      "[3620]\ttrain-rmse:0.323006\tvalid-rmse:0.360079\n",
      "[3640]\ttrain-rmse:0.322858\tvalid-rmse:0.360049\n",
      "[3660]\ttrain-rmse:0.322711\tvalid-rmse:0.360033\n",
      "[3680]\ttrain-rmse:0.322559\tvalid-rmse:0.360008\n",
      "[3700]\ttrain-rmse:0.32241\tvalid-rmse:0.359994\n",
      "[3720]\ttrain-rmse:0.322278\tvalid-rmse:0.359993\n",
      "[3740]\ttrain-rmse:0.322146\tvalid-rmse:0.359981\n",
      "[3760]\ttrain-rmse:0.322033\tvalid-rmse:0.359968\n",
      "[3780]\ttrain-rmse:0.32188\tvalid-rmse:0.359921\n",
      "[3800]\ttrain-rmse:0.321749\tvalid-rmse:0.359903\n",
      "[3820]\ttrain-rmse:0.321553\tvalid-rmse:0.359808\n",
      "[3840]\ttrain-rmse:0.32143\tvalid-rmse:0.359782\n",
      "[3860]\ttrain-rmse:0.321277\tvalid-rmse:0.359782\n",
      "[3880]\ttrain-rmse:0.32113\tvalid-rmse:0.359746\n",
      "[3900]\ttrain-rmse:0.320992\tvalid-rmse:0.359702\n",
      "[3920]\ttrain-rmse:0.320866\tvalid-rmse:0.359673\n",
      "[3940]\ttrain-rmse:0.320704\tvalid-rmse:0.3596\n",
      "[3960]\ttrain-rmse:0.320581\tvalid-rmse:0.359578\n",
      "[3980]\ttrain-rmse:0.320448\tvalid-rmse:0.359532\n",
      "[4000]\ttrain-rmse:0.320271\tvalid-rmse:0.359495\n",
      "[4020]\ttrain-rmse:0.32018\tvalid-rmse:0.359506\n",
      "[4040]\ttrain-rmse:0.319991\tvalid-rmse:0.359421\n",
      "[4060]\ttrain-rmse:0.319851\tvalid-rmse:0.359376\n",
      "[4080]\ttrain-rmse:0.319741\tvalid-rmse:0.359373\n",
      "[4100]\ttrain-rmse:0.319638\tvalid-rmse:0.359362\n",
      "[4120]\ttrain-rmse:0.319513\tvalid-rmse:0.359357\n",
      "[4140]\ttrain-rmse:0.319351\tvalid-rmse:0.359298\n",
      "[4160]\ttrain-rmse:0.319226\tvalid-rmse:0.359245\n",
      "[4180]\ttrain-rmse:0.319094\tvalid-rmse:0.359243\n",
      "[4200]\ttrain-rmse:0.318953\tvalid-rmse:0.359189\n",
      "[4220]\ttrain-rmse:0.318851\tvalid-rmse:0.359158\n",
      "[4240]\ttrain-rmse:0.318703\tvalid-rmse:0.359116\n",
      "[4260]\ttrain-rmse:0.3186\tvalid-rmse:0.359099\n",
      "[4280]\ttrain-rmse:0.318449\tvalid-rmse:0.359041\n",
      "[4300]\ttrain-rmse:0.318317\tvalid-rmse:0.359038\n",
      "[4320]\ttrain-rmse:0.318189\tvalid-rmse:0.35902\n",
      "[4340]\ttrain-rmse:0.318088\tvalid-rmse:0.359014\n",
      "[4360]\ttrain-rmse:0.317938\tvalid-rmse:0.35895\n",
      "[4380]\ttrain-rmse:0.317831\tvalid-rmse:0.358932\n",
      "[4400]\ttrain-rmse:0.317711\tvalid-rmse:0.358925\n",
      "[4420]\ttrain-rmse:0.317563\tvalid-rmse:0.358888\n",
      "[4440]\ttrain-rmse:0.317425\tvalid-rmse:0.358843\n",
      "[4460]\ttrain-rmse:0.317285\tvalid-rmse:0.358824\n",
      "[4480]\ttrain-rmse:0.317154\tvalid-rmse:0.358785\n",
      "[4500]\ttrain-rmse:0.31703\tvalid-rmse:0.358791\n",
      "[4520]\ttrain-rmse:0.316911\tvalid-rmse:0.358753\n",
      "[4540]\ttrain-rmse:0.316802\tvalid-rmse:0.35874\n",
      "[4560]\ttrain-rmse:0.316643\tvalid-rmse:0.358665\n",
      "[4580]\ttrain-rmse:0.316522\tvalid-rmse:0.358663\n",
      "[4600]\ttrain-rmse:0.316387\tvalid-rmse:0.358628\n",
      "[4620]\ttrain-rmse:0.316275\tvalid-rmse:0.358623\n",
      "[4640]\ttrain-rmse:0.316141\tvalid-rmse:0.358616\n",
      "[4660]\ttrain-rmse:0.315993\tvalid-rmse:0.358564\n",
      "[4680]\ttrain-rmse:0.315891\tvalid-rmse:0.358569\n",
      "[4700]\ttrain-rmse:0.315737\tvalid-rmse:0.358528\n",
      "[4720]\ttrain-rmse:0.315622\tvalid-rmse:0.358504\n",
      "[4740]\ttrain-rmse:0.315511\tvalid-rmse:0.358479\n",
      "[4760]\ttrain-rmse:0.315363\tvalid-rmse:0.358437\n",
      "[4780]\ttrain-rmse:0.315234\tvalid-rmse:0.358389\n",
      "[4800]\ttrain-rmse:0.315102\tvalid-rmse:0.358371\n",
      "[4820]\ttrain-rmse:0.314984\tvalid-rmse:0.358335\n",
      "[4840]\ttrain-rmse:0.314874\tvalid-rmse:0.358338\n",
      "[4860]\ttrain-rmse:0.314719\tvalid-rmse:0.358283\n",
      "[4880]\ttrain-rmse:0.314588\tvalid-rmse:0.358234\n",
      "[4900]\ttrain-rmse:0.314441\tvalid-rmse:0.358186\n",
      "[4920]\ttrain-rmse:0.314303\tvalid-rmse:0.358138\n",
      "[4940]\ttrain-rmse:0.31416\tvalid-rmse:0.358087\n",
      "[4960]\ttrain-rmse:0.314067\tvalid-rmse:0.35808\n",
      "[4980]\ttrain-rmse:0.313955\tvalid-rmse:0.358055\n",
      "[5000]\ttrain-rmse:0.313835\tvalid-rmse:0.358017\n",
      "[5020]\ttrain-rmse:0.313733\tvalid-rmse:0.358016\n",
      "[5040]\ttrain-rmse:0.313633\tvalid-rmse:0.357988\n",
      "[5060]\ttrain-rmse:0.313509\tvalid-rmse:0.357965\n",
      "[5080]\ttrain-rmse:0.313397\tvalid-rmse:0.357924\n",
      "[5100]\ttrain-rmse:0.313302\tvalid-rmse:0.357927\n",
      "[5120]\ttrain-rmse:0.313154\tvalid-rmse:0.357877\n",
      "[5140]\ttrain-rmse:0.313047\tvalid-rmse:0.357864\n",
      "[5160]\ttrain-rmse:0.312914\tvalid-rmse:0.357833\n",
      "[5180]\ttrain-rmse:0.312811\tvalid-rmse:0.357815\n",
      "[5200]\ttrain-rmse:0.312683\tvalid-rmse:0.357772\n",
      "[5220]\ttrain-rmse:0.312594\tvalid-rmse:0.357782\n",
      "[5240]\ttrain-rmse:0.312496\tvalid-rmse:0.35778\n",
      "[5260]\ttrain-rmse:0.312359\tvalid-rmse:0.357787\n",
      "[5280]\ttrain-rmse:0.312238\tvalid-rmse:0.35776\n",
      "[5300]\ttrain-rmse:0.312132\tvalid-rmse:0.357743\n",
      "[5320]\ttrain-rmse:0.312001\tvalid-rmse:0.357727\n",
      "[5340]\ttrain-rmse:0.311896\tvalid-rmse:0.357693\n",
      "[5360]\ttrain-rmse:0.311793\tvalid-rmse:0.357685\n",
      "[5380]\ttrain-rmse:0.311669\tvalid-rmse:0.357656\n",
      "[5400]\ttrain-rmse:0.311553\tvalid-rmse:0.357628\n",
      "[5420]\ttrain-rmse:0.311438\tvalid-rmse:0.357618\n",
      "[5440]\ttrain-rmse:0.311335\tvalid-rmse:0.357616\n",
      "[5460]\ttrain-rmse:0.311223\tvalid-rmse:0.357587\n",
      "[5480]\ttrain-rmse:0.311131\tvalid-rmse:0.357584\n",
      "[5500]\ttrain-rmse:0.311009\tvalid-rmse:0.357554\n",
      "[5520]\ttrain-rmse:0.310885\tvalid-rmse:0.357544\n",
      "[5540]\ttrain-rmse:0.310771\tvalid-rmse:0.357533\n",
      "[5560]\ttrain-rmse:0.310641\tvalid-rmse:0.357492\n",
      "[5580]\ttrain-rmse:0.310525\tvalid-rmse:0.357505\n",
      "[5600]\ttrain-rmse:0.310377\tvalid-rmse:0.357464\n",
      "[5620]\ttrain-rmse:0.310264\tvalid-rmse:0.35744\n",
      "[5640]\ttrain-rmse:0.310132\tvalid-rmse:0.357392\n",
      "[5660]\ttrain-rmse:0.310061\tvalid-rmse:0.357391\n",
      "[5680]\ttrain-rmse:0.309978\tvalid-rmse:0.357384\n",
      "[5700]\ttrain-rmse:0.309857\tvalid-rmse:0.357374\n",
      "[5720]\ttrain-rmse:0.30975\tvalid-rmse:0.357363\n",
      "[5740]\ttrain-rmse:0.309662\tvalid-rmse:0.35737\n",
      "[5760]\ttrain-rmse:0.309575\tvalid-rmse:0.357357\n",
      "[5780]\ttrain-rmse:0.309469\tvalid-rmse:0.357331\n",
      "[5800]\ttrain-rmse:0.309344\tvalid-rmse:0.3573\n",
      "[5820]\ttrain-rmse:0.309248\tvalid-rmse:0.357308\n",
      "[5840]\ttrain-rmse:0.309147\tvalid-rmse:0.357296\n",
      "[5860]\ttrain-rmse:0.309055\tvalid-rmse:0.357284\n",
      "[5880]\ttrain-rmse:0.308963\tvalid-rmse:0.357271\n",
      "[5900]\ttrain-rmse:0.30886\tvalid-rmse:0.357257\n",
      "[5920]\ttrain-rmse:0.308771\tvalid-rmse:0.357237\n",
      "[5940]\ttrain-rmse:0.308657\tvalid-rmse:0.357209\n",
      "[5960]\ttrain-rmse:0.308556\tvalid-rmse:0.357199\n",
      "[5980]\ttrain-rmse:0.308461\tvalid-rmse:0.357199\n",
      "[6000]\ttrain-rmse:0.308364\tvalid-rmse:0.357171\n",
      "[6020]\ttrain-rmse:0.30825\tvalid-rmse:0.35714\n",
      "[6040]\ttrain-rmse:0.308148\tvalid-rmse:0.357121\n",
      "[6060]\ttrain-rmse:0.308049\tvalid-rmse:0.357123\n",
      "[6080]\ttrain-rmse:0.307945\tvalid-rmse:0.357113\n",
      "[6100]\ttrain-rmse:0.307858\tvalid-rmse:0.357084\n",
      "[6120]\ttrain-rmse:0.307758\tvalid-rmse:0.357061\n",
      "[6140]\ttrain-rmse:0.307668\tvalid-rmse:0.357047\n",
      "[6160]\ttrain-rmse:0.307558\tvalid-rmse:0.357017\n",
      "[6180]\ttrain-rmse:0.307438\tvalid-rmse:0.357017\n",
      "[6200]\ttrain-rmse:0.307327\tvalid-rmse:0.357011\n",
      "[6220]\ttrain-rmse:0.307227\tvalid-rmse:0.356997\n",
      "[6240]\ttrain-rmse:0.307142\tvalid-rmse:0.357003\n",
      "[6260]\ttrain-rmse:0.307055\tvalid-rmse:0.356995\n",
      "[6280]\ttrain-rmse:0.306934\tvalid-rmse:0.356949\n",
      "[6300]\ttrain-rmse:0.306819\tvalid-rmse:0.356931\n",
      "[6320]\ttrain-rmse:0.306744\tvalid-rmse:0.356935\n",
      "[6340]\ttrain-rmse:0.306646\tvalid-rmse:0.35691\n",
      "[6360]\ttrain-rmse:0.306554\tvalid-rmse:0.356897\n",
      "[6380]\ttrain-rmse:0.306468\tvalid-rmse:0.356893\n",
      "[6400]\ttrain-rmse:0.306384\tvalid-rmse:0.356867\n",
      "[6420]\ttrain-rmse:0.306294\tvalid-rmse:0.356872\n",
      "[6440]\ttrain-rmse:0.306177\tvalid-rmse:0.356857\n",
      "[6460]\ttrain-rmse:0.306078\tvalid-rmse:0.356855\n",
      "[6480]\ttrain-rmse:0.305968\tvalid-rmse:0.35683\n",
      "[6500]\ttrain-rmse:0.305862\tvalid-rmse:0.356795\n",
      "[6520]\ttrain-rmse:0.305782\tvalid-rmse:0.356807\n",
      "[6540]\ttrain-rmse:0.30569\tvalid-rmse:0.356799\n",
      "[6560]\ttrain-rmse:0.305599\tvalid-rmse:0.356789\n",
      "[6580]\ttrain-rmse:0.305502\tvalid-rmse:0.3568\n",
      "[6600]\ttrain-rmse:0.305422\tvalid-rmse:0.356798\n",
      "Stopping. Best iteration:\n",
      "[6555]\ttrain-rmse:0.305624\tvalid-rmse:0.356783\n",
      "\n",
      "Modelling RMSE 0.35678\n"
     ]
    }
   ],
   "source": [
    "xgb_params = {}\n",
    "xgb_params[\"objective\"] = \"reg:linear\"\n",
    "xgb_params[\"eval_metric\"] = \"rmse\"\n",
    "xgb_params[\"eta\"] = 0.05\n",
    "xgb_params[\"min_child_weight\"] = 10\n",
    "xgb_params[\"subsample\"] = 0.9\n",
    "xgb_params[\"colsample_bytree\"] = 0.7\n",
    "xgb_params[\"max_depth\"] = 5\n",
    "xgb_params[\"silent\"] = 1\n",
    "xgb_params[\"seed\"] = 2019\n",
    "xgb_params[\"nthread\"] = -1\n",
    "xgb_params[\"lambda\"] = 2\n",
    "\n",
    "xgb_model = xgb.train(xgb_params, dtrain, 10000, watchlist, early_stopping_rounds=50,maximize=False, verbose_eval=20)\n",
    "print('Modelling RMSE %.5f' % xgb_model.best_score)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x26e019d4908>"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "xgb.plot_importance(xgb_model, height=0.7)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "1 of kfold 5\n",
      "Train RMSE: 0.43492Valid RMSE: 0.43218\n",
      "\n",
      "2 of kfold 5\n",
      "Train RMSE: 0.43439Valid RMSE: 0.43397\n",
      "\n",
      "3 of kfold 5\n",
      "Train RMSE: 0.43511Valid RMSE: 0.44201\n",
      "\n",
      "4 of kfold 5\n",
      "Train RMSE: 0.43435Valid RMSE: 0.43549\n",
      "\n",
      "5 of kfold 5\n",
      "Train RMSE: 0.43566Valid RMSE: 0.43660\n"
     ]
    }
   ],
   "source": [
    "xgb_params['num_round']=xgb_model.best_iteration\n",
    "xgb_model_final = xgb.XGBRegressor()\n",
    "xgb_score = cv_score(xgb_model_final)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "def cv_score_avg(ml_model_1, ml_model_2, w1=0.5, w2=0.5,rstate=12,cols=df.columns):\n",
    "    i=1\n",
    "    cv_scores=[]\n",
    "    df1=df.copy()\n",
    "    df1=df[cols]\n",
    "    \n",
    "    kf=KFold(n_splits=5,random_state=rstate,shuffle=True)\n",
    "    for train_index,test_index in kf.split(df1,df_y):\n",
    "        print('\\n{} of kfold {}'.format(i,kf.n_splits))\n",
    "        xtr,xvl = df1.loc[train_index],df1.loc[test_index]\n",
    "        ytr,yvl = df_y[train_index],df_y[test_index]\n",
    "        \n",
    "        model=ml_model_1\n",
    "        ml_model_1.fit(xtr,ytr)\n",
    "        pred_val_1 = ml_model_1.predict(xvl)\n",
    "        \n",
    "        model = ml_model_2\n",
    "        ml_model_2.fit(xtr,ytr)\n",
    "        pred_val_2 = ml_model_2.predict(xvl)\n",
    "        \n",
    "        final_pred = (pred_val_1*w1 + pred_val_2*w2)\n",
    "        \n",
    "        rmse_score = sqrt(mean_squared_error(yvl,final_pred))\n",
    "        \n",
    "        suffix = \"\"\n",
    "        msg = \"\"\n",
    "        \n",
    "        msg += \"Valid RMSE: {:.5f}\".format(rmse_score)\n",
    "        print(\"{}\".format(msg))\n",
    "        \n",
    "        cv_scores.append(rmse_score)\n",
    "        i+=1\n",
    "    return cv_scores    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "1 of kfold 5\n",
      "Valid RMSE: 0.42561\n",
      "\n",
      "2 of kfold 5\n",
      "Valid RMSE: 0.42856\n",
      "\n",
      "3 of kfold 5\n",
      "Valid RMSE: 0.43404\n",
      "\n",
      "4 of kfold 5\n",
      "Valid RMSE: 0.42821\n",
      "\n",
      "5 of kfold 5\n",
      "Valid RMSE: 0.42924\n"
     ]
    }
   ],
   "source": [
    "avg_scores = cv_score_avg(xgb_model_final, RandomForestRegressor(**rf_params),w1=0.4,w2=0.6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "xgb_model = xgb.XGBRegressor(**xgb_params)\n",
    "rf_model = RandomForestRegressor(**rf_params)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "from mlxtend.regressor import StackingCVRegressor\n",
    "\n",
    "stacked_model = StackingCVRegressor(\n",
    "    regressors=[xgb_model, rf_model],\n",
    "    meta_regressor = Ridge())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "1 of kfold 5\n",
      "Train RMSE: 0.40991Valid RMSE: 0.40832\n",
      "\n",
      "2 of kfold 5\n",
      "Train RMSE: 0.41144Valid RMSE: 0.41306\n",
      "\n",
      "3 of kfold 5\n",
      "Train RMSE: 0.40602Valid RMSE: 0.41210\n",
      "\n",
      "4 of kfold 5\n",
      "Train RMSE: 0.40619Valid RMSE: 0.40704\n",
      "\n",
      "5 of kfold 5\n",
      "Train RMSE: 0.40897Valid RMSE: 0.41132\n"
     ]
    }
   ],
   "source": [
    "stacking_scores = cv_score(stacked_model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x26e22881588>"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "results_df=pd.DataFrame({'RF':rf_scores,'XGB':xgb_score,'Average':avg_scores,'Stacking':stacking_scores})\n",
    "results_df.plot(y=[\"RF\",\"XGB\",\"Average\",\"Stacking\"],kind=\"bar\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
